package com.itheima.proxy;

import com.itheima.service.impl.RoleServiceImpl;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CglibProxyDemo {
    public static void main(String[] args) {
        //目标对象
       final RoleServiceImpl rsi = new RoleServiceImpl();
        /*
        Cglib代理对象的地址:com.itheima.service.impl.RoleServiceImpl$$EnhancerBy$$CglibXXX
        * Cglib动态代理
        * 基于父类(不需要接口)
        * 创建代理对象
        * 涉及的类:Enhancer
        * 涉及的方法::create(param1,param2)
        *       param1:目标对象的字节码类型(固定写法)
        *       param2:Callback代理处理方法,需要处理对象,需要程序员手动实现
        *       注意:使用Callback的子接口MethodInterceptor(方法对象拦截器)
        * */
        RoleServiceImpl rs = (RoleServiceImpl) Enhancer.create(rsi.getClass(), new MethodInterceptor() {
            /**
             *
             * @param proxy         代理对象(不给目标对象赋值的话,这个代理对象为null)
             * @param method        执行的目标方法对象
             * @param args          指向目标方法的参数列表
             * @param methodProxy   方法对象的代理对象(一般不用,但是要写)
             * @return
             * @throws Throwable
             */
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
               Object obj = null;
                try {
                    System.out.println("前置增强");//开启事务
                    obj = method.invoke(rsi, args);//执行usi对象上带有args参数列表的method方法
                    System.out.println("后置增强");//提交事务
                } catch (Exception e) {
                    System.out.println("异常增强");//回滚事务
                } finally {
                    System.out.println("最终增强");//释放资源
                }
                return obj;//代表的是执行目标方法对象的返回值
            }
        });
        rs.findAll();
    }
}
